Setup

successfully normalized  countdata
tested contrasts
successfully calculated contrasts:

QC

qc plots above

Differential expression

${regdir} regulated feature: ${num_reg}

${regdir} regulated feature: ${num_reg}

${regdir} regulated feature: ${num_reg}

${regdir} regulated feature: ${num_reg}

${regdir} regulated feature: ${num_reg}

${regdir} regulated feature: ${num_reg}

${regdir} regulated feature: ${num_reg}

${regdir} regulated feature: ${num_reg}

${regdir} regulated feature: ${num_reg}

${regdir} regulated feature: ${num_reg}

${regdir} regulated feature: ${num_reg}

${regdir} regulated feature: ${num_reg}

${regdir} regulated feature: ${num_reg}

${regdir} regulated feature: ${num_reg}

Fold Change Comparisons - Ctl vs Treatment

24h Change

24h-72h Change

0-72h Change

GO contrasts Enrichment

MT_vs_MB

Up

BP

MF

CC

Down

BP

MF

CC

Ctrl_MT_A24_vs_MT

Up

BP

MF

CC

Down

BP

MF

CC

Ctrl_MT_A72_vs_MT_A24

Up

BP

MF

CC

Down

BP

MF

CC

Ctrl_MT_A72_vs_MT0

Up

BP

MF

CC

Down

BP

MF

CC

Aspecific_MT_A24_vs_MT

Up

BP

MF

CC

Down

BP

MF

CC

Aspecific_MT_A72_vs_MT_A24

Up

BP

MF

CC

Down

BP

MF

CC

Aspecific_MT_A72_vs_MT0

Up

BP

MF

CC

Down

BP

MF

CC

GO - term table

GO - GO-gene map

Output Tables

Below you can see the files into which various objects from the above analysis have been saved.

dir.create(here('tables'),showWarnings = F)

#raw count data
counts(dds)%>%as.data.frame%>%rownames_to_column('gene_id')%>%write_tsv(here('tables/rawcountdata.tsv'))
assay(normcounts)%>%as.data.frame%>%rownames_to_column('gene_id')%>%write_tsv(here('tables/normcountdata.tsv'))
#all coefficient, fold changes
resultslist%>%map_df(.id='contrast',as.data.frame)%>%write_tsv(here('tables/allcontrasts.tsv'))

# #mapping from GO terms to genes
# GTOGO%>%write_tsv(here('tables/go_gene_map.tsv'))
# #
# contrgotables%>%write_tsv(here('tables/contrast_goenrich.tsv'))
LS0tCnRpdGxlOiAiTXVSRjEgVGltZWNvdXJzZSBER0UgcmVwb3J0IgpvdXRwdXQ6IAogaHRtbF9ub3RlYm9vazoKICB0b2M6IHllcwotLS0KICAKCiAgCiMgU2V0dXAKICAKYGBge3IgbG9hZGluZ2xpYnJhcmllcywgaW5jbHVkZT1GQUxTRSwgZWNobz1GQUxTRSwgZXZhbD1UfQprbml0cjo6b3B0c19jaHVuayRzZXQocm9vdC5kaXIgPSBoZXJlOjpoZXJlKCksZXZhbD1UUlVFLGNhY2hlPUZBTFNFLGVjaG89RkFMU0Usd2FybmluZyA9IEZBTFNFLG1lc3NhZ2UgPSBGQUxTRSxpbmNsdWRlPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBmaWcud2lkdGggPTcsZmlnLmhlaWdodD03LG91dC53aWR0aD03MDAsb3V0LmhlaWdodD03MDAsZGV2PSdwbmcnKQoKbGlicmFyeShybWFya2Rvd24pCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoaGVyZSkKbGlicmFyeShtYWdyaXR0cikKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZGJzY2FuKQoKZGlyLmNyZWF0ZShoZXJlKCdkYXRhJyksc2hvd1dhcm5pbmdzPUYpCmRpci5jcmVhdGUoaGVyZSgnUl9jYWNoZScpLHNob3dXYXJuaW5ncz1GKQoKYmFzZTo6c291cmNlKGhlcmUoJ3NyYy9ScHJvZmlsZS5SJykpCgoKYGBgCgoKYGBge3J9CmwyZmNfdGhyZXNob2xkIDwtIDAuMzIKYGBgCgpgYGB7ciBkZHMsIGluY2x1ZGU9RkFMU0UsIGVjaG89RkFMU0UsIGV2YWw9VFJVRX0KICB0cmltX2dpZHMgPC0gZnVuY3Rpb24oZGYpewogICAgZGY9YXMuZGF0YS5mcmFtZShkZik7CiAgICBkZiU+JW11dGF0ZV9hdCh2YXJzKG1hdGNoZXMoJ2dlbmVfaWR8ZmVhdHVyZV9pZCcpKSxsaXN0KH5zdHJfcmVwbGFjZSguLCdcXC5cXGQrJywnJykpKQogIH0KI3RoaXMgcGVybCBjcmVhdGVzIGEgZmlsZSB3aXRoIHVuaXF1ZSBnZW5lX2lkLCBnZW5lX25hbWUgaW4gcGFpcnMsIGZhc3RlciB0aGFuIGxvYWRpbmcgdGhlIHdob2xlIGd0ZiBpZiBpdCdzIGJpZwojIHBlcmwgLWxhbmUgJy9nZW5lX25hbWVcVysoXHcrKVxXLyA7bXkgJGE9JDE7L2dlbmVfaWRcVysoXHcrKVxXLzsgcHJpbnQoJGEsIlx0IiwkMSknIDwoY2F0ICBwaXBlbGluZS9nZW5lcy5jaHJubS5ndGYpIHwgdW5pcSB8IHNvcnQgfCB1bmlxID4gcGlwZWxpbmUvZ2lkXzJfZ25hbWUudHh0CiMgZ3RmIDwtIGhlcmUoJ3BpcGVsaW5lL2dlbmVzLmNocm5tLmd0ZicpCiMgYW5ubyA8LSBwcm9qbWVtb2lzZShmdW5jdGlvbihndGYpe3J0cmFja2xheWVyOjppbXBvcnQoZ3RmKX0pKGd0ZikKZ2lkMmduYW1lIDwtIGZyZWFkKGhlcmUoJ3BpcGVsaW5lL2dpZF8yX2duYW1lLnR4dCcpKSU+JXNldF9jb2xuYW1lcyhjKCdnZW5lX25hbWUnLCdnZW5lX2lkJykpCnR4MmdlbmUgPC0gIHJlYWRfdHN2KGhlcmUoJ3BpcGVsaW5lL3RyaWQyZ2lkLnR4dCcpKSU+JXNldF9jb2xuYW1lcyhjKCd0cl9pZCcsJ2dfaWQnKSkKCiNyZWFkIGluIHRoZSBzYW1wbGVfcGFyYW1ldGVyIGZpbGUgZnJvbSB0aGUgcGllcGxpbmUKc2FtcGRmIDwtIGZyZWFkKGhlcmUoJ3NyYy9zYW1wbGVfcGFyYW1ldGVyLmNzdicpKSU+JQogIHNlbGVjdCgtKGxpYnJhcnlfbGF5b3V0OmZyYWdtZW50X2xlbmd0aF9zZCkpJT4lCiAgYXMuZGF0YS5mcmFtZSU+JXNldF9yb3duYW1lcyguLC4kc2FtcGxlX2lkKQojdXNlIHRoZSBmYWN0b3Igb3JkZXJpbmcgaW4gdGhlIHNhbXBsZV9wYXJhbWV0ZXJzIGZpbGUgLSBieSBkZWZhdWx0IGl0IGdldHMKCnNhbXBkZiA8LSBzYW1wZGYlPiVtdXRhdGVfaWYoaXNfY2hhcmFjdGVyLGFzX2ZhY3RvcikKc2FtcGRmJGFzc2F5JTw+JWZjdF9yZWxldmVsKGMoJ3RvdGFsJywncmlibycpKQpzdG9waWZub3QoIWFueShpcy5uYShzYW1wZGYkYXNzYXkpKSkKIwppZihpcy5udWxsKHNhbXBkZiRzYW1wbGVfbmFtZSkpIHNhbXBkZiRzYW1wbGVfbmFtZSA8LSBzYW1wZGYkc2FtcGxlX2lkCiNyZWFkIHRoZSBjb3VudHMgZGF0YSAtIHRoaXMgdGFrZXMgYSB3aGlsZSBzb21ldGltZXMKIyBmaWxlLnJlbW92ZShoZXJlKCdkYXRhL2Rkcy5yZHMnKSkKCgppZighZmlsZS5leGlzdHMoaGVyZSgnZGF0YS9kZHMucmRzJykpKXsKICAgCgoKICBhbGxxdWFudGZpbGVzID0gU3lzLmdsb2IoaGVyZTo6aGVyZSgncGlwZWxpbmUvc2FsbW9uL2RhdGEvKi9xdWFudC5zZicpKQogIG5hbWVzKGFsbHF1YW50ZmlsZXMpIDwtIGFsbHF1YW50ZmlsZXMlPiVkaXJuYW1lJT4lYmFzZW5hbWUKCiAgdHhfY291bnRkYXRhID0gdHhpbXBvcnQoZmlsZXM9YWxscXVhbnRmaWxlcywKICAgIGlnbm9yZVR4VmVyc2lvbj1UUlVFLAogICAgdHgyZ2VuZT10eDJnZW5lLAogICAgdHlwZT0nc2FsbW9uJwogICkKCiAgaXNvX3R4X2NvdW50ZGF0YSA9IHR4aW1wb3J0KGZpbGVzPWFsbHF1YW50ZmlsZXMsCiAgICBpZ25vcmVUeFZlcnNpb249VFJVRSwKICAgIHR4T3V0PVRSVUUsCiAgICB0eDJnZW5lPXR4MmdlbmUsCiAgICB0eXBlPSdzYWxtb24nLAogICAgaW1wb3J0ZXIgPSAgIGZ1bmN0aW9uKGZpbGUpe3JlYWRfdHN2KGZpbGUsY29sX3R5cGVzPWNvbHMoKSklPiUKICAgICAgICBtdXRhdGUoTmFtZT1zdHJfZXh0cmFjdChOYW1lLCdFTlNHXFx3K3xFTlNNVVNUXFx3KycpKQogICAgICB9CiAgKQoKICBkZHMgPC0gREVTZXFEYXRhU2V0RnJvbVR4aW1wb3J0KHR4X2NvdW50ZGF0YSwgCiAgICAjIHNhbXBkZiU+JW11dGF0ZShncm91cD1wYXN0ZTAoY2VsbF90eXBlLCdfJyx0aW1lKSU+JXN0cl9yZXBsYWNlKCdfMCcsJycpKSwKICAgIHNhbXBkZiU+JW11dGF0ZShncm91cD1ncm91cCU+JXN0cl9yZXBsYWNlKCdfXFxkJCcsJycpKSwKICAgIH4gZ3JvdXAgKQogICMgY29sbmFtZXMoY291bnRzKGRkcykpPC1zYW1wZGYkc2FtcGxlX2lkCiAgc2F2ZVJEUyhkZHMsaGVyZSgnZGF0YS9kZHMucmRzJykpCn1lbHNlewogIGRkcyA8LXJlYWRSRFMoaGVyZSgnZGF0YS9kZHMucmRzJykpCn0KY2F0KCdzdWNjZXNzZnVsbHkgbG9hZGVkICBjb3VudGRhdGEgYW5kIGFubm90YXRpb24nKQpzdG9waWZub3QoZXhpc3RzKCdzYW1wZGYnKSkKYGBgCgoKYGBge3IgZ2V0IG5vcm1hbGl6ZWQgY291bnRzfQojeW91IG1pZ2h0IHdhbnQgdG8gdXNlIHZzdCBpZiB0aGVyZSdzIGEgbG90IG9mIGRhdGEsIGZvciBzcGVlZApkaXIuY3JlYXRlKGhlcmUoJ2RhdGEnKSkKaWYoIWZpbGUuZXhpc3RzKGhlcmUoJ2RhdGEvbm9ybWNvdW50cy5yZHMnKSkpewogIAogIG5vcm1mdW5jIDwtIGlmKG5jb2woZGRzKT4yMCkgREVTZXEyOjpybG9nIGVsc2UgREVTZXEyOjp2c3QKICAKICBub3JtY291bnRzIDwtIG5vcm1mdW5jKGRkcykKICByb3duYW1lcyhub3JtY291bnRzKSA8LSByb3duYW1lcyhkZHMpCiAgc2F2ZVJEUyhub3JtY291bnRzLGhlcmUoJ2RhdGEvbm9ybWNvdW50cy5yZHMnKSkKfWVsc2V7CiAgbm9ybWNvdW50czwtcmVhZFJEUyhoZXJlKCdkYXRhL25vcm1jb3VudHMucmRzJykpCn0KY2F0KCdzdWNjZXNzZnVsbHkgbm9ybWFsaXplZCAgY291bnRkYXRhJykKYGBgCgoKYGBge3IgdGVzdCBjb250cmFzdHMsZXZhbD1UUlVFfQpzdG9waWZub3QoZXhpc3RzKCdkZHMnKSkKc3RvcGlmbm90KGV4aXN0cygnbm9ybWNvdW50cycpKQpzdG9waWZub3QoZXhpc3RzKCdzYW1wZGYnKSkKewogICNkbyBhIHRyaWFsIHJ1biBvZiBERVNlcSB0byBnZXQgdGhlIGNvbnRyYXN0IG5hbWVzCiAgZGVzaWduIDwtIGFzLmZvcm11bGEoJ34gZ3JvdXAnKQogIGRlc2lnbihkZHMpID0gZGVzaWduCiAgdGVzdGRkcyA9IERFU2VxKGhlYWQoZGRzLDIqbmNvbChkZHMpKSkKICByZXNuYW1lcyA9IHJlc3VsdHNOYW1lcyh0ZXN0ZGRzKQogIAp9CiMgWzFdICJJbnRlcmNlcHQiICAgICAgICAgICAgICJncm91cF9NVF92c19NQiIgICAgICAgICJncm91cF9NVF9BMjRfdnNfTUIiCiMgWzRdICJncm91cF9NVF9BNzJfdnNfTUIiICAgICJncm91cF9NVF9DdHJsMjRfdnNfTUIiICJncm91cF9NVF9DdHJsNzJfdnNfTUIiCnJlc25hbWVzID0gcmVzdWx0c05hbWVzKHRlc3RkZHMpCgpzZ3JvdXB2ZWN0cyA9IG1vZGVsLm1hdHJpeChkYXRhPWRkc0Bjb2xEYXRhLGRlc2lnbihkZHMpKSU+JXNldF9yb3duYW1lcyhkZHNAY29sRGF0YSRncm91cCklPiV7Llt1bmlxdWUocm93bmFtZXMoLikpLF19JT4lCnttPS47bGFwcGx5KDE6bnJvdyguKSU+JXNldE5hbWVzKHJvd25hbWVzKG0pKSxmdW5jdGlvbihpKXttW2ksXX0pIH0KCmNvbnRyYXN0cyA8LSBsaXN0KAogICJNVF92c19NQiIgPSB3aXRoKHNncm91cHZlY3RzLE1UIC0gTUIpLAogICJDdHJsX01UX0EyNF92c19NVCIgPSB3aXRoKHNncm91cHZlY3RzLE1UX0N0cmwyNCAtIE1UKSwKICAiQ3RybF9NVF9BNzJfdnNfTVRfQTI0IiA9IHdpdGgoc2dyb3VwdmVjdHMsTVRfQ3RybDcyIC0gTVRfQ3RybDI0KSwKICAiQ3RybF9NVF9BNzJfdnNfTVQwIiA9IHdpdGgoc2dyb3VwdmVjdHMsTVRfQ3RybDcyIC0gTVQpLAogICJBc3BlY2lmaWNfTVRfQTI0X3ZzX01UIiA9IHdpdGgoc2dyb3VwdmVjdHMsKE1UX0EyNCAtIE1UKSAtIChNVF9DdHJsMjQgLSBNVCkpLAogICJBc3BlY2lmaWNfTVRfQTcyX3ZzX01UX0EyNCIgPSB3aXRoKHNncm91cHZlY3RzLChNVF9BNzIgLSBNVF9BMjQpIC0gKE1UX0N0cmw3MiAtIE1UX0N0cmwyNCkpLAogICJBc3BlY2lmaWNfTVRfQTcyX3ZzX01UMCIgPSB3aXRoKHNncm91cHZlY3RzLChNVF9BNzIgLSBNVCkgLSAoTVRfQ3RybDcyIC0gTVQpKQopCgojY2hlY2sgdGhlIGNvbnRyYXN0cwpmb3IoY29udHJhc3RuYW1lIGluIG5hbWVzKGNvbnRyYXN0cykpewogIGNvbnRyYXN0ID0gY29udHJhc3RzW1tjb250cmFzdG5hbWVdXQogIGlmKGlzLmNoYXJhY3Rlcihjb250cmFzdCkgJiBsZW5ndGgoY29udHJhc3QpPT0xKXsKICAgIGFzc2VydF90aGF0KGNvbnRyYXN0ICVpbiUgcmVzbmFtZXMpCiAgICBjb250cmFzdCA8LSBhcy5udW1lcmljKHJlc25hbWVzPT1jb250cmFzdCkKICB9CiAgbWVzc2FnZShjb250cmFzdG5hbWUpCiAgdHJ5KHsKICAgIHJlc3VsdHModGVzdGRkcyxjb250cmFzdCkKICB9KQp9CgpjYXQoJ3Rlc3RlZCBjb250cmFzdHMnKQpgYGAKCgpgYGB7ciBydW5jb250cmFzdHMsZXZhbD1UUlVFfQojeW91IG1pZ2h0IHdhbnQgdG8gdXNlIHZzdCBpZiB0aGVyZSdzIGEgbG90IG9mIGRhdGEsIGZvciBzcGVlZAojIGZpbGUucmVtb3ZlKGhlcmUoJ2RhdGEvcmVzdWx0c2xpc3QucmRzJykpCmRpci5jcmVhdGUoaGVyZSgnZGF0YScpKQppZighZmlsZS5leGlzdHMoaGVyZSgnZGF0YS9yZXN1bHRzbGlzdC5yZHMnKSkpewoJZGVzaWduKGRkcykgPC0gZGVzaWduCiAKICBkZHMgPC0gREVTZXEoZGRzLGJldGFQcmlvciA9IEYpCiAgI2FuZCBnZXQgdGhlIGNvbnRyYXN0cyB3ZSBuZWVkCiAgcmVzdWx0c2xpc3QgPC0gbGFwcGx5KGNvbnRyYXN0cyxyZXN1bHRzLG9iamVjdCA9IGRkcykKICBuYW1lcyhyZXN1bHRzbGlzdCkgPC0gbmFtZXMoY29udHJhc3RzKQogIGZvcihpIGluIHNlcV9hbG9uZyhyZXN1bHRzbGlzdCkpcmVzdWx0c2xpc3RbW2ldXSRnZW5lX2lkID0gcm93bmFtZXMoZGRzKQogIAogIGRkc3RvZGY8LSBmdW5jdGlvbihkZHNkZilyZXN1bHRzKGRkc0xSVCklPiVhcy5kYXRhLmZyYW1lJT4lcm93bmFtZXNfdG9fY29sdW1uKCdnZW5lX2lkJykKICBkZHNMUlQgPSBERVNlcShkZHMsIHRlc3Q9IkxSVCIsIGZ1bGw9fmdyb3VwLHJlZHVjZWQgPSB+IDEpCiAgY2hhbmdlZ2VuZXMgPC0gcmVzdWx0cyhkZHNMUlQpJT4lZGRzdG9kZiAlPiVzdWJzZXQlPiVmaWx0ZXIocGFkaiA8IDAuMDUpJT4lLiRnZW5lX2lkCiAgc2F2ZVJEUyhjaGFuZ2VnZW5lcyxoZXJlKCdkYXRhL2NoYW5nZWdlbmVzLnJkcycpKQoKICByZXN1bHRzbGlzdCAlPD4lIG1hcCguJT4lYXMuZGF0YS5mcmFtZSU+JXRyaW1fZ2lkcykKICAKICBzYXZlUkRTKHJlc3VsdHNsaXN0LGhlcmUoJ2RhdGEvcmVzdWx0c2xpc3QucmRzJykpCiAgCiAgCgogIAp9ZWxzZXsKICByZXN1bHRzbGlzdDwtcmVhZFJEUyhoZXJlKCdkYXRhL3Jlc3VsdHNsaXN0LnJkcycpKQogIGNoYW5nZWdlbmVzPC1yZWFkUkRTKGhlcmUoJ2RhdGEvY2hhbmdlZ2VuZXMucmRzJykpCn0KCmNhdCgnc3VjY2Vzc2Z1bGx5IGNhbGN1bGF0ZWQgY29udHJhc3RzOicpCm1lc3NhZ2UobmFtZXMocmVzdWx0c2xpc3QpJT4lcGFzdGUoY29sbGFwc2U9JyAnKSkKCgpgYGAKCgojIFFDIHsudGFic2V0fQpgYGB7ciBxYywgaW5jbHVkZSA9IFRSVUUsbWVzc2FnZT1UUlVFLGV2YWw9RixjYWNoZT1GLHJlc3VsdHM9J2FzaXMnfQpzdG9waWZub3QoZXhpc3RzKCdkZHMnKSkKc3RvcGlmbm90KGV4aXN0cygnbm9ybWNvdW50cycpKQpzdG9waWZub3QoZXhpc3RzKCdzYW1wZGYnKSkKCmNhdCgiIyMgZGlzcHBsb3QiKQojcGxvdERpc3BFc3RzKGRkcykKcmxkIDwtIG5vcm1jb3VudHMKY2F0KCIjIyBvdXRsaWVycGxvdCIpCmlmKGlzLm51bGwoU3VtbWFyaXplZEV4cGVyaW1lbnQ6OmFzc2F5cyhkZHMpW1siY29va3MiXV0pKXsKICBudWxsdGV4dCA9ICJDb29rcyBkaXN0YW5jZSBpcyBtZWFuaW5nbGVzc1xuIGJlY2F1c2Ugd2Ugb25seSBoYXZlIG9uZSBncm91cCBwZXIgc2FtcGxlIgogICMgcXBsb3QobGFiZWw9bnVsbHRleHQseD0xLGdlb209J3RleHQnLHk9MSxzaXplPUkoMTQpKSt0aGVtZV9idygpCn1lbHNlewogIGJveHBsb3QobG9nMTAoU3VtbWFyaXplZEV4cGVyaW1lbnQ6OmFzc2F5cyhkZHMpW1siY29va3MiXV0pLCByYW5nZT0wLCBsYXM9MikKfQoKY2F0KCIjIyBjb3VudGRpc3QgLHdhcm5pbmc9RiIpCm15X2NvdW50cyA8LQogIERFU2VxMjo6Y291bnRzKGRkcyklPiUKICBhcy5kYXRhLmZyYW1lKCkgJT4lCiAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oImZlYXR1cmVfaWQiKSAlPiUKICB0aWR5cjo6Z2F0aGVyKHNhbXBsZV9pZCwgY291bnQsIC1mZWF0dXJlX2lkKQoKc2FtcGxlX2Fubm90IDwtIGFzLmRhdGEuZnJhbWUoU3VtbWFyaXplZEV4cGVyaW1lbnQ6OmNvbERhdGEoZGRzKSkKaWYoISdzYW1wbGVfbmFtZScgJWluJSBjb2xuYW1lcyhzYW1wbGVfYW5ub3QpKSBzYW1wbGVfYW5ub3Qkc2FtcGxlX25hbWU8LXNhbXBsZV9hbm5vdCRzYW1wbGVfaWQKbXlfY291bnRzIDwtCiAgZHBseXI6OmxlZnRfam9pbihteV9jb3VudHMsIHNhbXBsZV9hbm5vdCwgYnkgPSAic2FtcGxlX2lkIikKCnN0b3BpZm5vdChleGlzdHMoJ2RkcycpKQoKbXlfY291bnRzICU+JQogIGdncGxvdChhZXMoeCA9IGNvdW50ICsgMWUtMywgY29sb3IgPSBncm91cCwgZ3JvdXAgPSBzYW1wbGVfbmFtZSkpICsKICBnZW9tX2RlbnNpdHkoKSArCiAgc2NhbGVfeF9sb2cxMCgpCgpteV9jb3VudHMgJT4lCiAgZHBseXI6OmFycmFuZ2UoZ3JvdXApICU+JQogIGRwbHlyOjptdXRhdGUoc2FtcGxlX25hbWUgPSBmYWN0b3Ioc2FtcGxlX25hbWUsIGxldmVscyA9IHVuaXF1ZShzYW1wbGVfbmFtZSkpKSAlPiUKICBnZ3Bsb3QoYWVzKHkgPSBjb3VudCArIDFlLTMsIGNvbG9yID0gZ3JvdXAsIHggPSBzYW1wbGVfbmFtZSkpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV95X2xvZzEwKCkgKwogIGNvb3JkX2ZsaXAoKQoKCmNhdCgiIyMgcmxkZGYiKQpzdG9waWZub3QoaXMocmxkLCdERVNlcVRyYW5zZm9ybScpKQoKcmxkX2RmIDwtIGFzc2F5KHJsZCkKCnJsZF9kZiA8LQogIGFzc2F5KHJsZCkgJT4lCiAgYXMuZGF0YS5mcmFtZSgpICU+JQogIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKCdmZWF0dXJlX2lkJykgJT4lCiAgdGliYmxlOjphc19kYXRhX2ZyYW1lKCkgJT4lCiAgdGlkeXI6OmdhdGhlcihzYW1wbGVfaWQsIHJlZ19sb2dfY291bnQsIC1mZWF0dXJlX2lkKQoKcmxkX2RmJHNhbXBsZV9uYW1lIDwtIHNhbXBsZV9hbm5vdCRzYW1wbGVfbmFtZVttYXRjaChybGRfZGYkc2FtcGxlX2lkLGNvbERhdGEoZGRzKSRzYW1wbGVfaWQpXQojIHJsZF9kZiA8LSBnZXRfcmVnX2xvZ19jb3VudHMoZGRzLCBibGluZCA9IFQpCgpybGRfZGlzcGVyc2lvbiA8LQogIHJsZF9kZiAgJT4lCiAgZHBseXI6Omdyb3VwX2J5KGZlYXR1cmVfaWQpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UobWVhbl9yZWdfbG9nX2NvdW50ID0gbWVhbihyZWdfbG9nX2NvdW50KSwKICAgICAgICAgICAgICAgICAgIHNkX3JlZ19sb2dfY291bnQgPSBzZChyZWdfbG9nX2NvdW50KSkKCnJsZF9kaXNwZXJzaW9uICU+JQogIGdncGxvdChhZXMoeSA9IHNkX3JlZ19sb2dfY291bnQsIHggPSBtZWFuX3JlZ19sb2dfY291bnQpKSArCiAgZ2VvbV9wb2ludCgpICsKICBsYWJzKHggPSAibWVhbiBsb2cgcmVndWxhcml6ZWQgY291bnRzIiwgeSA9ICJzdGFuZGFyIGRldmlhdGlvbiBsb2cgcmVndWxhcml6ZWQgY291bnRzIikKCgpjYXQoIiMjIHBjYSwgY2FjaGUgPSBGLCBmaWdfd2lkdGg9MTIsZmlnX2hlaWdodD0xMiIpCnN0b3BpZm5vdChjb2xuYW1lcyhybGQpPT1jb2xuYW1lcyhkZHMpKQoKbWVzc2FnZSgnY2FsY3VsYXRpbmcgUENBcycpCnBjYSA9IERFU2VxMjo6cGxvdFBDQShybGQsaW50Z3JvdXA9Imdyb3VwIikKcGNhID0gcGNhICsKICBleHBhbmRfbGltaXRzKHggPSBwY2EkZGF0YSRQQzEgJT4lCiAgICAgICAgICAgICAgICAgIHJhbmdlICU+JQogICAgICAgICAgICAgICAgICBtdWx0aXBseV9ieSgxLjUpKSArCiAgZXhwYW5kX2xpbWl0cyh5ID0gcGNhJGRhdGEkUEMyICU+JQogICAgICAgICAgICAgICAgICByYW5nZSAlPiUKICAgICAgICAgICAgICAgICAgbXVsdGlwbHlfYnkoMS4zKSkKIyhwY2ErZ2VvbV90ZXh0KGFlcyhncm91cCksc2l6ZT1JKDIpLGFscGhhPUkoMC41KSkpICU+JSB7LiRsYXllcnM9LiRsYXllcnNbLTFdOy4rZ2VvbV9wb2ludChzaXplPUkoMCkpfSArCiMgIGdndGl0bGUoJ1BDQSA6IGxhYmVsbGVkIGJ5IHNhbXBsZW5hbWUnKQojd2UgYWxzbyB3YW50IGEgdGFibGUgd2l0aCB0aGVzZSBkYXRhIHRvIHBpY2sgb3V0IG91dGxpZXJzCnBjYSRkYXRhICU+JSB3cml0ZV90c3YoaGVyZSgnZGF0YS9wY2EudHN2JykpCgpjYXQoIiMjIHBjYV9ncm91cGxhYmVsLCBmaWdfd2lkdGg9MTIsZmlnX2hlaWdodD0xMiIpCihwY2ErZ2VvbV90ZXh0KGFlcyhsYWJlbD1ncm91cCksc2l6ZT1JKDIpLGFscGhhPUkoMC41KSkpJT4ley4kbGF5ZXJzPS4kbGF5ZXJzWy0xXTsuK2dlb21fcG9pbnQoc2l6ZT1JKDApKX0rZ2d0aXRsZSgnUENBIDogbGFiZWxsZWQgYnkgZ3JvdXAnKQoKY2F0KCIjIyBwY2Ffbm9sYWJlbCwgZmlnX3dpZHRoPTEyLGZpZ19oZWlnaHQ9MTIiKQoocGNhK2dlb21fdGV4dChhZXMobGFiZWw9Z3JvdXApLHNpemU9SSgwKSxhbHBoYT1JKDAuNSkpKSU+JXsuJGxheWVycz0uJGxheWVyc1stMV07LitnZW9tX3BvaW50KHNpemU9SSgzKSl9K2dndGl0bGUoJ1BDQScpCgoKY2F0KCIjIyBoZWF0bWFwIikKIyBkdWFsIHNjYWxlIHNldHRpbmdzIGZvciBoZWF0bWFwcwojIyBzZXR0aW5nIHZhbHVlcyBvdXRzaWRlIG9mIHRoZSByYW5nZSBbel9taW4sIHpfbWF4XSB0byB0aGUgbGltaXRpbmcgdmFsdWVzCmlmKCFleGlzdHMoJ3pfbWF4JykpIHpfbWF4IDwtICAzLjUKaWYoIWV4aXN0cygnel9taW4nKSkgel9taW4gPC0gLTMuNQojIGNvbG5hbWVzKHJsZF9kZikgJTw+JSB7c3RyaW5ncjo6c3RyX3JlcGxhY2UoLiwnc2FtcGxlX2lkJywnc2FtcGxlX25hbWUnKX0KcGxvdF9oZWF0bWFwX2ZsdWNfZmVhdHVyZXMoNTAwLCBybGRfZGYsIHpfbWluID0gel9taW4sIHpfbWF4ID0gel9tYXgpCgpteV9jb3VudHMlPD4lZ3JvdXBfYnkoc2FtcGxlX25hbWUpJT4lCiAgbXV0YXRlKGNvdW50Y2xhc3MgPSBjYXNlX3doZW4oCiAgICBjb3VudCA+IDEwMDAgfiAnPiAxMDAwJywKICAgIGNvdW50ID4gMTAwIH4gJz4gMTAwJywKICAgIGNvdW50ID4gMzIgfiAnPiAzMicsCiAgICBjb3VudCA+IDggfiAnPiA4JywKICAgIGNvdW50ID4gMCB+ICc8IDgnLAogICAgY291bnQgPT0wIH4gJyAwICcsCiAgICBUUlVFIH4gJ05BJwogICkpCgpteV9jb3VudHMkY291bnRjbGFzcyU8PiVmYWN0b3IobGV2ZWxzPWMoJz4gMTAwMCcsJz4gMTAwJywnPiAzMicsJz4gOCcsJzwgOCcsJyAwICcpKQpzdG9waWZub3QoIWFueShpcy5uYShteV9jb3VudHMkY291bnRjbGFzcykpKQoKCm15X2NvdW50cyU+JQogIGdyb3VwX2J5KHNhbXBsZV9uYW1lLGNvdW50Y2xhc3MpJT4ldGFsbHklPiVzcHJlYWQoY291bnRjbGFzcyxuKSU+JS5bcmV2KGNvbG5hbWVzKC4pKV0lPiVzZWxlY3Qoc2FtcGxlX25hbWUsZXZlcnl0aGluZygpKSU+JWthYmxlKGxhYmVsPSdnZW5lIGNvdW50IGNsYXNzZXMnKQoKYGBgCgpxYyBwbG90cyBhYm92ZQoKCgoKCiMgRGlmZmVyZW50aWFsIGV4cHJlc3Npb24KCmBgYHtyLCByZXN1bHRzPSdhc2lzJyxldmFsPVRSVUV9Cgpjb250cmFzdCA9IG5hbWVzKHJlc3VsdHNsaXN0KVtbNF1dCnJlZ2RpcmZ1bmNzID0gbGlzdChVcD1pZGVudGl0eSxEb3duPWZ1bmN0aW9uKHgpeCAqIC0xKQpyZWdkaXI9J1VwJwoKZm9yKGNvbnRyYXN0IGluIG5hbWVzKHJlc3VsdHNsaXN0KSl7CiAgZm9yKHJlZ2RpciBpbiBuYW1lcyhyZWdkaXJmdW5jcykpewogICAgcmVnZGlyZnVuYyA9IHJlZ2RpcmZ1bmNzW1tyZWdkaXJdXQogICAgcmVzID0gcmVzdWx0c2xpc3RbW2NvbnRyYXN0XV0lPiVhcy5kYXRhLmZyYW1lJT4ldHJpbV9naWRzCiAgICAgCiAgICBwcmludChxcGxvdChkYXRhID0gcmVzLCBsb2cxMChiYXNlTWVhbiksIGxvZzJGb2xkQ2hhbmdlICwgc2l6ZT1JKDAuMiksIGNvbG9yPSBwYWRqIDwgMC4wNSkrdGhlbWVfYncoKStzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoJ2JsYWNrJywncmVkJykpKQogICAgCiAgICAKICAgIGxpYnJhcnkoRFQpCiAgICAgIHJlZ19mZWF0dXJlcyA9IHJlcyU+JWZpbHRlcihwYWRqPDAuMDUscmVnZGlyZnVuYyhsb2cyRm9sZENoYW5nZSkgPiBsMmZjX3RocmVzaG9sZCkgCiAgICAgIG51bV9yZWcgPC0gbnJvdyhyZWdfZmVhdHVyZXMpCiAgICAgIAogICAgICBjYXQoIiR7cmVnZGlyfSByZWd1bGF0ZWQgZmVhdHVyZTogJHtudW1fcmVnfSIpCgogICAgICByZWdfZmVhdHVyZXMgJT4lIHNlbGVjdCgtbWF0Y2hlcygnY29udHJhc3QnKSkgJT4lCiAgICAgICAgbGVmdF9qb2luKGdpZDJnbmFtZSU+JXNlbGVjdChnZW5lX2lkLGdlbmVfbmFtZSkpJT4lCiAgICAgICAgc2VsZWN0KGdlbmVfbmFtZSxnZW5lX2lkLGJhc2VNZWFuLGxvZzJGb2xkQ2hhbmdlLHBhZGosZXZlcnl0aGluZygpKSU+JQogICAgICAgIERUOjpkYXRhdGFibGUocm93bmFtZXMgPSBGLGVzY2FwZSA9IEYsZXh0ZW5zaW9ucyA9ICdCdXR0b25zJywgCiAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgIGRvbT0nQmZydGlwJywKICAgICAgICAgICAgICAgICAgICBidXR0b25zID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZD0nY3N2JywKICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9ucz1jKCdjc3YnKSwKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0nZG93bmxvYWQnKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgKQogICAgICAgICkKICB9Cn0KYGBgCgoKIyBGb2xkIENoYW5nZSBDb21wYXJpc29ucyAtIEN0bCB2cyBUcmVhdG1lbnR7LnRhYnNldH0KCiMjIDI0aCBDaGFuZ2UKCmBgYHtyLGV2YWw9VFJVRX0KI2dldCBoaWdoY291bnQgZ2VuZXMKaGlnaGNvdW50Z2VuZXM8LWNvdW50cyhkZHMpJT4lYXMuZGF0YS5mcmFtZSU+JXJvd25hbWVzX3RvX2NvbHVtbignZ2VuZV9pZCcpJT4lZ2F0aGVyKGxpYixjb3VudCwtZ2VuZV9pZCklPiUKICAgIG11dGF0ZShsaWIgPSBzdHJfcmVwbGFjZShsaWIsJ19cXGQkJywnJykpJT4lCiAge3N0b3BpZm5vdCh0YWxseSguKSU+JS4kbiU+JXRhYmxlJT4lbGVuZ3RoJT4lYD09YCgxKSk7Ln0lPiUKICAgIGdyb3VwX2J5KGdlbmVfaWQpJT4lCiAgICBzdW1tYXJpc2UoY291bnQ9c3VtKGNvdW50KSklPiUKICAgIGZpbHRlcihjb3VudD4zMiklPiUKICAuJGdlbmVfaWQKCiMgI2RhdGEgc2V0IGZvciBmb2xkIGNoYW5nZXMKZmNzZXRkZiA9IHJlc3VsdHNsaXN0JEFzcGVjaWZpY19NVF9BMjRfdnNfTVQlPiVzZWxlY3QoU3BlY18yNF9wYWRqID1wYWRqLCBTcGVjXzI0X2xmYyA9IGxvZzJGb2xkQ2hhbmdlLGdlbmVfaWQpJT4lCiAgICBsZWZ0X2pvaW4ocmVzdWx0c2xpc3QkQ3RybF9NVF9BMjRfdnNfTVQlPiVhcy5kYXRhLmZyYW1lJT4lCiAgICAgICAgICAgICAgICBzZWxlY3QoQ3RsXzI0X3BhZGogPXBhZGosIEN0cmxfMjRfbGZjID0gbG9nMkZvbGRDaGFuZ2UsZ2VuZV9pZCkpJT4lCiAgICBmaWx0ZXIoZ2VuZV9pZCAlaW4lIGhpZ2hjb3VudGdlbmVzKSU+JQogICAgbXV0YXRlKAogICAgICBBY2hhbmdlID0gKHNpZ24oU3BlY18yNF9sZmMpKSphcy5udW1lcmljKFNwZWNfMjRfcGFkajwwLjA1KSwKICAgICAgQ3RsY2hhbmdlID0gKHNpZ24oQ3RybF8yNF9sZmMpKSphcy5udW1lcmljKEN0bF8yNF9wYWRqPDAuMDUpLAogICAgICBzZXQgPSBjYXNlX3doZW4oCiAgICAgICAoKEFjaGFuZ2UgKiBDdGxjaGFuZ2UpID09IC0xKSAgfiAnY29tcGVuc2F0aW5nJywKICAgICAgKEN0bGNoYW5nZSAqIEFjaGFuZ2UpID09IDEgIH4gJ2NvbmN1cnJlbnQnICwKICAgICAgICAoYWJzKEN0bGNoYW5nZSkpID09IDEgfiAiQ3RsIE9ubHkiLAogICAgICAgIChhYnMoQWNoYW5nZSkpID09IDEgfiAiU3BlY2lmaWMgT25seSIsCiAgICAgIFRSVUUgfiAnTm9uZScKICAgICAgKQogICAgKQoKY2hhbmdlY29sczwtYygnIzFkYjIyMCcsJ3JlZCcsJ3B1cnBsZScsJ2JsdWUnLCdncmV5JyklPiVzZXROYW1lcyhjKCJDdGwgT25seSIsICJTcGVjaWZpYyBPbmx5IiwgImNvbXBlbnNhdGluZyIsICJjb25jdXJyZW50IiwnTm9uZScpKQpzdG9waWZub3QoZmNzZXRkZiRzZXQlPiV1bmlxdWUlPiVpc19pbihuYW1lcyhjaGFuZ2Vjb2xzKSkpCiNwcmludCBmYyBwbG90CmRpci5jcmVhdGUoaGVyZSgndGFibGVzJyksc2hvd1dhcm5pbmdzID0gRikKZmNzZXRkZiU+JWxlZnRfam9pbihnaWQyZ25hbWUlPiVzZWxlY3QoZ2VuZV9pZCxnZW5lX25hbWUpKSU+JXdyaXRlX3RzdihoZXJlKCd0YWJsZXMvZmNzZXRkZi50c3YnKSVUPiVub3JtYWxpemVQYXRoJVQ+JW1lc3NhZ2UpCnAgPSBmY3NldGRmICU+JQogIGZpbHRlcighaXMubmEoc2V0KSklPiUKICBmaWx0ZXIoIXNldD09Ik5vbmUiKSU+JQogIGFycmFuZ2Uoc2V0IT0iTm9uZSIpJT4lCiAgbXV0YXRlKHNldD1hc19mYWN0b3Ioc2V0KSklPiUKICBxcGxvdChkYXRhPS4seD1DdHJsXzI0X2xmYyx5PVNwZWNfMjRfbGZjK0N0cmxfMjRfbGZjLGdlb209J2JsYW5rJyxjb2xvcj1zZXQpKwogIGdlb21fcG9pbnQoc2l6ZT1JKC41KSkrCiAgdGhlbWVfYncoKSsKICBzY2FsZV9jb2xvcl9tYW51YWwoJ1NldCcsdmFsdWVzID0gY2hhbmdlY29scykrCiAgc2NhbGVfeF9jb250aW51b3VzKCdDb250cm9sIGNoYW5nZSAyNGgnLGxpbWl0cz1jKC0zLDMpKSsKICBzY2FsZV95X2NvbnRpbnVvdXMoJ0NvbnRyb2wrU3BlY2lmaWMgY2hhbmdlJyxsaW1pdHM9YygtMywzKSkrCiAgY29vcmRfZml4ZWQoKQpwCiMgcGxvdGZpbGUgPC0gJ3Bsb3RzL3h0YWlsX2ZjLnBkZicKIyBkaXIuY3JlYXRlKGRpcm5hbWUocGxvdGZpbGUpKQojcGRmKHBsb3RmaWxlKQojIHByaW50KHApCiNkZXYub2ZmKCkKIyBtZXNzYWdlKG5vcm1hbGl6ZVBhdGgocGxvdGZpbGUpKQpsaWJyYXJ5KERUKQpkYXRhdGFibGUoZmNzZXRkZiU+JWxlZnRfam9pbihnaWQyZ25hbWUpJT4lc2VsZWN0KGdlbmVfbmFtZSxnZW5lX2lkLHNldCksZmlsdGVyPWMoJ3RvcCcpKQoKYGBgCgoKIyMgMjRoLTcyaCBDaGFuZ2UKCmBgYHtyLGV2YWw9VFJVRSxjYWNoZT1UUlVFfQpmY3NldGRmbGF0ZSA9IHJlc3VsdHNsaXN0JEFzcGVjaWZpY19NVF9BNzJfdnNfTVRfQTI0JT4lc2VsZWN0KFNwZWNfNzJfcGFkaiA9cGFkaiwgU3BlY183Ml9sZmMgPSBsb2cyRm9sZENoYW5nZSxnZW5lX2lkKSU+JQogICAgbGVmdF9qb2luKHJlc3VsdHNsaXN0JEN0cmxfTVRfQTcyX3ZzX01UX0EyNCU+JWFzLmRhdGEuZnJhbWUlPiUKICAgICAgICAgICAgICAgIHNlbGVjdChDdGxfNzJfcGFkaiA9cGFkaiwgQ3RybF83Ml9sZmMgPSBsb2cyRm9sZENoYW5nZSxnZW5lX2lkKSklPiUKICAgIGZpbHRlcihnZW5lX2lkICVpbiUgaGlnaGNvdW50Z2VuZXMpJT4lCiAgICBtdXRhdGUoCiAgICAgIEFjaGFuZ2UgPSAoc2lnbihTcGVjXzcyX2xmYykpKmFzLm51bWVyaWMoU3BlY183Ml9wYWRqPDAuMDUpLAogICAgICBDdGxjaGFuZ2UgPSAoc2lnbihDdHJsXzcyX2xmYykpKmFzLm51bWVyaWMoQ3RsXzcyX3BhZGo8MC4wNSksCiAgICAgIHNldCA9IGNhc2Vfd2hlbigKICAgICAgICgoQWNoYW5nZSAqIEN0bGNoYW5nZSkgPT0gLTEpICB+ICdjb21wZW5zYXRpbmcnLAogICAgICAoQ3RsY2hhbmdlICogQWNoYW5nZSkgPT0gMSAgfiAnY29uY3VycmVudCcgLAogICAgICAgIChhYnMoQ3RsY2hhbmdlKSkgPT0gMSB+ICJDdGwgT25seSIsCiAgICAgICAgKGFicyhBY2hhbmdlKSkgPT0gMSB+ICJTcGVjaWZpYyBPbmx5IiwKICAgICAgVFJVRSB+ICdOb25lJwogICAgICApCiAgICApCiNwcmludCBmYyBwbG90CmZjc2V0ZGZsYXRlJT4lbGVmdF9qb2luKGdpZDJnbmFtZSU+JXNlbGVjdChnZW5lX2lkLGdlbmVfbmFtZSkpJT4ld3JpdGVfdHN2KGhlcmUoJ3RhYmxlcy9mY3NldGRmbGF0ZS50c3YnKSVUPiVub3JtYWxpemVQYXRoJVQ+JW1lc3NhZ2UpCnAgPSBmY3NldGRmbGF0ZSAlPiUKICBmaWx0ZXIoIWlzLm5hKHNldCkpJT4lCiAgZmlsdGVyKCFzZXQ9PSJOb25lIiklPiUKICBhcnJhbmdlKHNldCE9Ik5vbmUiKSU+JQogIG11dGF0ZShzZXQ9YXNfZmFjdG9yKHNldCkpJT4lCiAgcXBsb3QoZGF0YT0uLHg9Q3RybF83Ml9sZmMseT1TcGVjXzcyX2xmYytDdHJsXzcyX2xmYyxnZW9tPSdibGFuaycsY29sb3I9c2V0KSsKICBnZW9tX3BvaW50KHNpemU9SSguMikpKwogIHRoZW1lX2J3KCkrCiAgc2NhbGVfY29sb3JfbWFudWFsKCdTZXQnLHZhbHVlcyA9IGNoYW5nZWNvbHMpKwogIHNjYWxlX3hfY29udGludW91cygnQ29udHJvbCBjaGFuZ2UgNzJoJyxsaW1pdHM9YygtMywzKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKCdDb250cm9sK1NwZWNpZmljIGNoYW5nZSAoeHRhaWwpJyxsaW1pdHM9YygtMywzKSkrCiAgY29vcmRfZml4ZWQoKQpwCnBsb3RmaWxlIDwtICdwbG90cy94dGFpbF9mYy5wZGYnCmRpci5jcmVhdGUoZGlybmFtZShwbG90ZmlsZSkpCiNwZGYocGxvdGZpbGUpCiMgcHJpbnQocCkKI2Rldi5vZmYoKQojIG1lc3NhZ2Uobm9ybWFsaXplUGF0aChwbG90ZmlsZSkpCmxpYnJhcnkoRFQpCmRhdGF0YWJsZShmY3NldGRmJT4lbGVmdF9qb2luKGdpZDJnbmFtZSklPiVzZWxlY3QoZ2VuZV9uYW1lLGdlbmVfaWQsc2V0KSxmaWx0ZXI9YygndG9wJykpCgpgYGAKCgojIyAwLTcyaCBDaGFuZ2UKCmBgYHtyLGV2YWw9VFJVRSxjYWNoZT1UUlVFfQpmY3NldGRmbGF0ZSA9IHJlc3VsdHNsaXN0JEFzcGVjaWZpY19NVF9BNzJfdnNfTVQwJT4lc2VsZWN0KFNwZWNfNzJfcGFkaiA9cGFkaiwgU3BlY183Ml9sZmMgPSBsb2cyRm9sZENoYW5nZSxnZW5lX2lkKSU+JQogICAgbGVmdF9qb2luKHJlc3VsdHNsaXN0JEN0cmxfTVRfQTcyX3ZzX01UMCU+JWFzLmRhdGEuZnJhbWUlPiUKICAgICAgICAgICAgICAgIHNlbGVjdChDdGxfNzJfcGFkaiA9cGFkaiwgQ3RybF83Ml9sZmMgPSBsb2cyRm9sZENoYW5nZSxnZW5lX2lkKSklPiUKICAgIGZpbHRlcihnZW5lX2lkICVpbiUgaGlnaGNvdW50Z2VuZXMpJT4lCiAgICBtdXRhdGUoCiAgICAgIEFjaGFuZ2UgPSAoc2lnbihTcGVjXzcyX2xmYykpKmFzLm51bWVyaWMoU3BlY183Ml9wYWRqPDAuMDUpLAogICAgICBDdGxjaGFuZ2UgPSAoc2lnbihDdHJsXzcyX2xmYykpKmFzLm51bWVyaWMoQ3RsXzcyX3BhZGo8MC4wNSksCiAgICAgIHNldCA9IGNhc2Vfd2hlbigKICAgICAgICgoQWNoYW5nZSAqIEN0bGNoYW5nZSkgPT0gLTEpICB+ICdjb21wZW5zYXRpbmcnLAogICAgICAoQ3RsY2hhbmdlICogQWNoYW5nZSkgPT0gMSAgfiAnY29uY3VycmVudCcgLAogICAgICAgIChhYnMoQ3RsY2hhbmdlKSkgPT0gMSB+ICJDdGwgT25seSIsCiAgICAgICAgKGFicyhBY2hhbmdlKSkgPT0gMSB+ICJTcGVjaWZpYyBPbmx5IiwKICAgICAgVFJVRSB+ICdOb25lJwogICAgICApCiAgICApCiNwcmludCBmYyBwbG90CmZjc2V0ZGZsYXRlJT4lbGVmdF9qb2luKGdpZDJnbmFtZSU+JXNlbGVjdChnZW5lX2lkLGdlbmVfbmFtZSkpJT4ld3JpdGVfdHN2KGhlcmUoJ3RhYmxlcy9mY3NldGRmbGF0ZS50c3YnKSVUPiVub3JtYWxpemVQYXRoJVQ+JW1lc3NhZ2UpCnAgPSBmY3NldGRmbGF0ZSAlPiUKICBmaWx0ZXIoIWlzLm5hKHNldCkpJT4lCiAgZmlsdGVyKCFzZXQ9PSJOb25lIiklPiUKICBhcnJhbmdlKHNldCE9Ik5vbmUiKSU+JQogIG11dGF0ZShzZXQ9YXNfZmFjdG9yKHNldCkpJT4lCiAgcXBsb3QoZGF0YT0uLHg9Q3RybF83Ml9sZmMseT1TcGVjXzcyX2xmYytDdHJsXzcyX2xmYyxnZW9tPSdibGFuaycsY29sb3I9c2V0KSsKICBnZW9tX3BvaW50KHNpemU9SSguMikpKwogIHRoZW1lX2J3KCkrCiAgc2NhbGVfY29sb3JfbWFudWFsKCdTZXQnLHZhbHVlcyA9IGNoYW5nZWNvbHMpKwogIHNjYWxlX3hfY29udGludW91cygnQ29udHJvbCBjaGFuZ2UgNzJoJyxsaW1pdHM9YygtMywzKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKCdDb250cm9sK1NwZWNpZmljIGNoYW5nZSAoeHRhaWwpJyxsaW1pdHM9YygtMywzKSkrCiAgY29vcmRfZml4ZWQoKQpwCnBsb3RmaWxlIDwtICdwbG90cy94dGFpbF9mYy5wZGYnCmRpci5jcmVhdGUoZGlybmFtZShwbG90ZmlsZSkpCiNwZGYocGxvdGZpbGUpCiMgcHJpbnQocCkKI2Rldi5vZmYoKQojIG1lc3NhZ2Uobm9ybWFsaXplUGF0aChwbG90ZmlsZSkpCmxpYnJhcnkoRFQpCmRhdGF0YWJsZShmY3NldGRmJT4lbGVmdF9qb2luKGdpZDJnbmFtZSklPiVzZWxlY3QoZ2VuZV9uYW1lLGdlbmVfaWQsc2V0KSxmaWx0ZXI9YygndG9wJykpCgpgYGAKCgoKYGBge3IsZXZhbD1UUlVFLGNhY2hlPVRSVUV9CmJhc2U6OnNvdXJjZShoZXJlKCdzcmMvZ29mdW5jcy5SJykpCkdUT0dPIDwtIHNlbGVjdChHVE9HTyxnZW5lX25hbWUsZ29faWQsZ2VuZV9pZCklPiVmaWx0ZXIoZ2VuZV9pZCAlaW4lIChyb3duYW1lcyhub3JtY291bnRzKSU+JXN0cl9yZXBsYWNlKC4sJ1xcLlxcZCsnLCcnKSkpJT4lZ3JvdXBfYnkoZ29faWQpJT4lZmlsdGVyKG4oKT4xMCkKCnJlZ2RpcmZ1bmNzID0gbGlzdChVcD1pZGVudGl0eSxEb3duPWZ1bmN0aW9uKHgpeCAqIC0xKQoKZmNfZGYgPC0gcmVzdWx0c2xpc3RbWyJNVF92c19NQiJdXQpyZWdkaXJmdW5jPXJlZ2RpcmZ1bmNzW1siVXAiXV0Kb250PSdCUCcKIyBmaWxlLnJlbW92ZShoZXJlKCdkYXRhL2NvbnRyZ290YWJsZXMucmRzJykpCmlmKCFmaWxlLmV4aXN0cyhoZXJlKCdkYXRhL2NvbnRyZ290YWJsZXMucmRzJykpKXsKICBjb250cmdvdGFibGVzPC1tY2xhcHBseShtYy5jb3Jlcz00LHJlc3VsdHNsaXN0LGZ1bmN0aW9uKGZjX2RmKXsKICAgIG1hcF9kZiguaWQ9J3JlZ2RpcicscmVnZGlyZnVuY3MsZnVuY3Rpb24ocmVnZGlyZnVuYyl7CiAgICAgIG1hcF9kZiguaWQ9J29udG9sb2d5JyxjKCdCUCcsJ01GJywnQ0MnKSU+JXNldE5hbWVzKC4sLiksZnVuY3Rpb24ob250KXsKICAgICAgICAgIHNpZ2dlbmVzID0gZmNfZGYlPiV7c2V0TmFtZXMoKHJlZ2RpcmZ1bmMoLiRsb2cyRm9sZENoYW5nZSk+MCkgJiAoLiRwYWRqPDAuMDUpLC4kZ2VuZV9pZCl9CiAgICAgICAgICBnb3RhYmxlID0gcG9zc2libHkocnVuZ28sb3RoZXJ3aXNlID0gTlVMTCxxdWlldD1UUlVFKShzaWdnZW5lcyxHVE9HTyxvbnQpCiAgICAgICAgICBnb3RhYmxlCiAgICAgICAgICAKICAgICAgfSkKICAgIH0pCiAgfSklPiViaW5kX3Jvd3MoLmlkPSdjb250cmFzdCcpCiAgc2F2ZVJEUyhjb250cmdvdGFibGVzLGhlcmUoJ2RhdGEvY29udHJnb3RhYmxlcy5yZHMnKSkKfWVsc2V7CiAgY29udHJnb3RhYmxlczwtcmVhZFJEUyhoZXJlKCdkYXRhL2NvbnRyZ290YWJsZXMucmRzJykpCn0KCgpgYGAKCgojIEdPIGNvbnRyYXN0cyBFbnJpY2htZW50ey50YWJzZXR9CmBgYHtyLGV2YWw9VFJVRSxyZXN1bHRzPSdhc2lzJyxjYWNoZT1UUlVFfQoKZm9yKGNvbnRyIGluIHVuaXF1ZShjb250cmdvdGFibGVzJGNvbnRyYXN0KSl7CiAgY2F0KHBhc3RlMCgiIyMgIixjb250ciwney50YWJzZXR9XG4nKSkKICBmb3IocmVnZCBpbiB1bmlxdWUoY29udHJnb3RhYmxlcyRyZWdkaXIpKXsKICBjYXQocGFzdGUwKCIjIyMgIixyZWdkLCd7LnRhYnNldH1cbicpKQogICAgIGZvcihvbnQgaW4gdW5pcXVlKGNvbnRyZ290YWJsZXMkb250b2xvZ3kpKXsKICBjYXQocGFzdGUwKCIjIyMjICIsb250LCdcbicpKQogICAgICAgICBnb3RhYmxlID0gY29udHJnb3RhYmxlcyU+JWZpbHRlcihjb250cmFzdD09Y29udHIscmVnZGlyPT1yZWdkLG9udG9sb2d5PT1vbnQpCiAgICAgICAgIHByaW50KHBsb3RfZ29fZW5yaWNoKGdvdGFibGUsJ2VsaW1GaXNoZXInLHBhc3RlKGNvbnRyLHJlZ2Qsb250KSkpCiAgICAgfQogIH0KfQpgYGAKCiMgR08gLSB0ZXJtIHRhYmxlCgpgYGB7cixldmFsPVRSVUUsY2FjaGU9VFJVRX0KbGlicmFyeShEVCkKZGF0YXRhYmxlIDwtIHB1cnJyOjpwYXJ0aWFsKERUOjpkYXRhdGFibGUsCiAgICAgICAgICAgIGV4dGVuc2lvbnMgPSAnQnV0dG9ucycsCiAgICAgICAgIG9wdGlvbnMgPSBsaXN0KGRvbSA9ICdCbGZydGlwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9ucyA9IGMoJ2NzdicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhNZW51ID0gbGlzdChjKDEwLDI1LDUwLC0xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygxMCwyNSw1MCwiQWxsIikpKSkKCmRhdGF0YWJsZShjb250cmdvdGFibGVzJT4lc2VsZWN0KG9udG9sb2d5LGNvbnRyYXN0LHJlZ2RpcixHTy5JRCxlbGltRmlzaGVyLFRlcm0sRW5yaWNobWVudCxBbm5vdGF0ZWQsU2lnbmlmaWNhbnQsRXhwZWN0ZWQpLGZpbHRlcj1jKCd0b3AnKSkKYGBgCgojIEdPIC0gR08tZ2VuZSBtYXAKCmBgYHtyLGV2YWw9VFJVRSxjYWNoZT1UUlVFfQpsaWJyYXJ5KERUKQpnb3MgPSBHVE9HTyRnb19pZCU+JXVuaXF1ZSU+JWludGVyc2VjdChrZXlzKEdPVEVSTSkpCnRlcm1zID0gVGVybShHT1RFUk1bZ29zXSklPiVlbmZyYW1lKCdnb19pZCcsJ3Rlcm0nKQpHVE9HTyU+JWlubmVyX2pvaW4odGVybXMsYnk9J2dvX2lkJyklPiUKZGF0YXRhYmxlKGZpbHRlcj1jKCd0b3AnKSkKYGBgCgojIE91dHB1dCBUYWJsZXMKCkJlbG93IHlvdSBjYW4gc2VlIHRoZSBmaWxlcyBpbnRvIHdoaWNoIHZhcmlvdXMgb2JqZWN0cyBmcm9tIHRoZSBhYm92ZSBhbmFseXNpcyBoYXZlIGJlZW4gc2F2ZWQuCgpgYGB7ciwgZWNobz1UUlVFLGluY2x1ZGU9VFJVRX0KZGlyLmNyZWF0ZShoZXJlKCd0YWJsZXMnKSxzaG93V2FybmluZ3MgPSBGKQoKI3JhdyBjb3VudCBkYXRhCmNvdW50cyhkZHMpJT4lYXMuZGF0YS5mcmFtZSU+JXJvd25hbWVzX3RvX2NvbHVtbignZ2VuZV9pZCcpJT4ld3JpdGVfdHN2KGhlcmUoJ3RhYmxlcy9yYXdjb3VudGRhdGEudHN2JykpCmFzc2F5KG5vcm1jb3VudHMpJT4lYXMuZGF0YS5mcmFtZSU+JXJvd25hbWVzX3RvX2NvbHVtbignZ2VuZV9pZCcpJT4ld3JpdGVfdHN2KGhlcmUoJ3RhYmxlcy9ub3JtY291bnRkYXRhLnRzdicpKQojYWxsIGNvZWZmaWNpZW50LCBmb2xkIGNoYW5nZXMKcmVzdWx0c2xpc3QlPiVtYXBfZGYoLmlkPSdjb250cmFzdCcsYXMuZGF0YS5mcmFtZSklPiV3cml0ZV90c3YoaGVyZSgndGFibGVzL2FsbGNvbnRyYXN0cy50c3YnKSkKCiMgI21hcHBpbmcgZnJvbSBHTyB0ZXJtcyB0byBnZW5lcwojIEdUT0dPJT4ld3JpdGVfdHN2KGhlcmUoJ3RhYmxlcy9nb19nZW5lX21hcC50c3YnKSkKIyAjCiMgY29udHJnb3RhYmxlcyU+JXdyaXRlX3RzdihoZXJlKCd0YWJsZXMvY29udHJhc3RfZ29lbnJpY2gudHN2JykpCgo=